<?php
defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * 标签函数库
 * 
 * @desc 
 * @version 1.0.0 
 * @author  Jason
 * @date	2017年7月3日 下午5:00:38
 */
class Lib_tag extends Lib_database
{
	/** @var Mod_tag */
	private $mod_tag = null;
	
	use libraries\common\DatabaseCURD;
	
	use libraries\common\ConditionParser;
	
	public function __construct()
	{
		parent::__construct();
		
		$this->CI->config->load('enumeration');
		
		$this->CI->load->model('mod_tag');
		$this->mod_tag =& $this->CI->mod_tag;
		
		$this->set_render_config();
	}
	
	private function set_render_config()
	{
		$foreign_keys = [
				'master' => [
						['parent_id', ['name'], $this->mod_tag, 'master', 'id'],
				],
				'relation' => [
						['tag_id', ['name', 'module', 'language'], $this->mod_tag, 'master', 'id'],
				],
		];
		$time_fields = [
				'master' => [
						['create_time', 'Y-m-d H:i:s'],
				],
				'relation' => [
						['create_time', 'Y-m-d H:i:s'],
				],
		];
		$encode_fields = [
				'master' => [],
				'relation' => [],
		];
		$this->foreign_keys = $foreign_keys;
		$this->time_fields = $time_fields;
		$this->encode_fields = $encode_fields;
	}
	
	public function get_tag_for_detail($id)
	{
		$item = $this->mod_tag->select_instance_by_id($id);
		$item = $this->render_list($item, 'master', true, [
				[$this, 'parse_tag_item'],
		]);
		return $item;
	}
	
	public function get_tags_for_list($conditions, $page = 1, $number = 12)
	{
		$data = $this->mod_tag->get_list($conditions, $page, $number);
		$data['data'] = $this->render_list($data['data'], 'master', false, [
				[$this, 'parse_tag_item'],
		]);
		return $data;
	}
	
	public function parse_tag_item($item)
	{
		$mapper_metrix = $this->CI->config->item('mapper_metrix')['tag']['master'];
		
		$item['module_text'] = @$mapper_metrix['module'][$item['module']];
		$item['status_tags'] = $this->mod_tag->calculate_status_tags($item['status']);
		return $item;
	}
	
	/**
	 * 指定ID的父级标签是否已经存在
	 *
	 * @desc	适用场景：在添加广告时指定广告位ID，这个广告位是需要存在的！
	 * @date	2017年6月13日 下午5:42:48
	 *
	 * @param number $tag_id
	 *
	 * @return boolean
	 */
	public function has_tag_exists($tag_id)
	{
		if ($tag_id === '0') {
			return true;
		}
		$selected_id = $this->mod_tag->select_fields_by_id($tag_id, ['id']);
		return !empty($selected_id);
	}
	
	/**
	 * 是否是支持的模块
	 *
	 * @date	2017年6月13日 下午7:41:03
	 *
	 * @param string $type
	 *
	 * @return boolean
	 */
	public function is_supported_module($module)
	{
		$module_mapper = $this->CI->config->item('mapper_metrix')['tag']['master']['module'];
		
		return array_key_exists($module, $module_mapper);
	}
	
	/**
	 * 标签启用禁用（显示不显示）
	 *
	 * @author  Jason
	 * @date	2017年6月14日 下午2:31:25
	 *
	 * @param number $id
	 *
	 * @return [<status>, <content>]	一个两元素数组，第一个元素表示状态，第二个表示相应内容
	 * 	        eg:	[true, ['nowTag' => 'enabled']]
	 * 				[true, ['nowTag' => 'disabled']]
	 * 				[false, ['error']]
	 */
	public function toggle_status_enabled($id)
	{
		$status = true;
		$ultimateTag = $this->mod_tag->toggle_status_by_tag($id);
		
		return [$status, ['nowTag' => $ultimateTag]];
	}
	
	/**
	 * 获取热评标签
	 *
	 * @desc    获取的只是一个列表
	 * @author  Jason
	 * @date    2017年7月4日 下午3:52:16
	 *
	 * @param   type variable
	 *
	 * @return  array
	 */
	public function get_hot_tags_by_unique_key($module, $parent_id, $language = null)
	{
		$conditions = [
				['select', 'id, name'],
				['where', [['module' => $module, 'parent_id' => $parent_id]]],
				['order_by', 'sort_order DESC'],
				['limit', 10],
		];
		if (!empty($language)) {
			$conditions[] = ['where', [['language' => $language]]];
		}
		$tags = $this->mod_tag->select_instances_by_conditions($conditions);
		
		return $tags;
	}
	
	/**
	 * 设置标签关系
	 * 
	 * @desc    尝试查询tag并设置关系，如果tag不存在创建之。
	 * @author  Jason
	 * @date	2017年7月3日 下午18:08:37
	 * @param   string $module		标签模块名
	 * @param   number $parent_id	标签父ID
	 * @param   string $language	标签语言
	 * @param   string $name		标签名称、标题、内容
	 * @param   string $source_type	关系的资源类型
	 * @param   number $source_id	关系的资源ID
	 * @param   number $source_group_id	关系的资源分组ID
	 * 
	 * @return  [<status>, <content>]	一个两元素数组，第一个元素表示状态，第二个表示相应内容
	 * 	        eg:	[true, <userData>]
	 * 				[false, <errorMesg>]
	 */
	public function set_relation_tag($module, $parent_id, $language, $name, $source_type, $source_id, $source_group_id = null)
	{
		list($has, $tag) = $this->mod_tag->has_tag_exists($module, $parent_id, $language, $name);
		if ( ! $has) {
			$data = [
					'module' => $module,
					'parent_id' => $parent_id,
					'language' => $language,
					'name' => $name,
			];
			list($status, $content) = $this->mod_tag->create_instance($data);
			$tag = ($status) ? $content : $content['data'];
		}
		
		if (empty($tag['id'])) {
			$status = false;
			$content = ['tag_msg_create_error'];
		} else {
			$tag['module'] = $module;
			$tag['language'] = $language;
			list($status, $content) = $this->mod_tag->set_relation($source_type, $source_id, $source_group_id, $tag);
			if ($status) {
				$content = ['tag' => $tag, 'relation' => $content];
			}
		}
		
		return [$status, $content];
	}
	
	/**
	 * 获取标签关系
	 *
	 * @desc    根据资源类型和ID或语言，获取关系
	 * @author  Jason
	 * @date	2017年7月3日 下午18:08:37
	 * @param   string $source_type	关系的资源类型
	 * @param   number $source_id	关系的资源ID
	 * @param   number $tag_language	关系的语言标识，用于过滤用，可省略
	 *
	 * @return  array
	 */
	public function get_tag_relations($source_type, $source_id, $tag_language = null)
	{
		$conditions = [
				['select', 'id, tag_id, tag_module, tag_language'],
				['where', [['source_type' => $source_type, 'source_id' => $source_id]]],
		];
		if (!empty($tag_language)) {
			$conditions[] = ['where', [['tag_language' => $tag_language]]];
		}
		$relations = $this->mod_tag->select_instances_by_conditions($conditions, 'relation');
		$relations = $this->render_list($relations, 'relation');
		
		return $relations;
	}
	
	/**
	 * 获取标签关系-根据外部资源分组ID
	 *
	 * @desc    根据资源类型和分组ID或语言，获取关系
	 * @author  Jason
	 * @date	2017年7月3日 下午18:08:37
	 * @param   string $source_type		关系的资源类型
	 * @param   number $source_group_id	关系的资源分组ID
	 * @param   number $tag_language	关系的语言标识，用于过滤用，可省略
	 *
	 * @return  array
	 */
	public function get_tag_relations_by_group($source_type, $source_group_id, $tag_language = null)
	{
		$conditions = [
				['select', 'id, tag_id, tag_module, tag_language'],
				['where', [['source_type' => $source_type, 'source_group_id' => $source_group_id]]],
		];
		if (!empty($tag_language)) {
			$conditions[] = ['where', [['tag_language' => $tag_language]]];
		}
		$relations = $this->mod_tag->select_instances_by_conditions($conditions, 'relation');
		$relations = $this->render_list($relations, 'relation');
		
		return $relations;
	}
	
	/**
	 * 往资源列表中追加标签（名称）列表
	 *
	 * @desc    往资源列表中追加标签（名称）列表，追加的tags里面只含显示用的标签名称
	 * @author  Jason
	 * @date	2017年7月7日 下午15:08:28
	 * @param   string $source_type	关系的资源类型
	 * @param   boolean $by_group	是否根据分组ID查询
	 *
	 * @return  array with tags
	 */
	public function append_relations_for_resource_list($resource_list, $source_type, $by_group = false)
	{
		$by_ids = array_column($resource_list, 'id') ? : [-1];
		$by_field = ($by_group) ? 'source_group_id' : 'source_id';
		$conditions = [
				['select', 'source_id, source_group_id, tag_id'],
				['where', "source_type='$source_type'"],
				['where_in', [$by_field, $by_ids]],
		];
		$relations = $this->mod_tag->select_instances_by_conditions($conditions, 'relation');
		$relations = $this->render_list($relations, 'relation');
		
		$dictionary = [];
		foreach ($relations as $relation) {
			$dictionary[$relation[$by_field]][] = $relation['tag_id_name'];
		}
		
		foreach ($resource_list as &$resource) {
			$tags = isset($dictionary[$resource['id']]) ? $dictionary[$resource['id']] : [];
			$resource['tags'] = $tags;
		}
		unset($resource);
		
		return $resource_list;
	}
	
}